package edu.uoc.tds.pec3.db.dao;

import java.util.List;
import java.util.Vector;
import java.util.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.io.Serializable;
import edu.uoc.tds.pec3.beans.*;
import edu.uoc.tds.pec3.exceptions.*;
import edu.uoc.tds.pec3.db.GestorConnexio;

/** 
 * Classe per a gestionar les operacions amb la BD de Alumnes 
 * @version 1.0; 19-04-2009; java version "1.6.0"; 
 * @author Francisco Jos� Villar Alvarez - Juan Pablo L�pez Pulpillo
 */

public class AlumneDAO implements DAO<Alumne>, Serializable {

	/** Connexio a la bd. */
	private Connection conn;
	/** Necessari per a la serialitzaci� d'aquest objecte. */
	private static final long serialVersionUID = 2864159033160348530L;
	
	/** 
	 * Constructor sense parametres que obt� la connexi� a la BD
	 * {post: el atribut privat conn t� assignada una connexi� a la bd} 
	 * @throws GestorException
	 */
	public AlumneDAO() throws GestorException {
		GestorConnexio gestor = GestorConnexio.getInstance();
		this.conn = gestor.getConnection();
	}
	
	/** 
	 * No s'implementa ja que no es necessari per aquesta PAC 
	 */
	@Override
	public void delete(Alumne alumne) throws DAOException {}

	/** 
	 * No s'implementa ja que no es necessari per aquesta PAC 
	 */
	@Override
	public void delete(String id) throws DAOException {}

	/**
	 * Retorna els alumnes que compleixen una determinada condici�
	 * {pre: el parametre where podra estar buit o tenir una sentencia SQL valida}
	 * {post: es retornar� un vector de alumnes que compleixen la condicio o tots si
	 * la condici� es buida}
	 * @param where - cadena amb la condici� SQL WHERE per a filtrar la cerca
	 * @return Vector de Alumnes que compleixen la condici�
	 * @throws DAOException
	 */
	@Override
	public List<Alumne> find(String where) throws DAOException {
		
		Statement stmt = null;
		Vector<Alumne> list = new Vector<Alumne>();
		ResultSet rs = null;
		
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_ALUMNO, NOMBRE, APELLIDOS, FECHA_NACIMIENTO");
		sql.append("  FROM ALUMNOS"); 
		
		if(where != null && where.trim().length() > 0)
			sql.append("   WHERE ").append(where); 
		
		try {
			stmt = this.conn.createStatement();
			rs = stmt.executeQuery(sql.toString());
			while(rs.next()){
				Alumne alumne = new Alumne();
				alumne.setIdAlumne(rs.getLong(1));
				alumne.setNom(rs.getString(2));
				alumne.setCognoms(rs.getString(3));
				java.sql.Date data = rs.getDate(4);
				if(!rs.wasNull()) alumne.setDataNaixement(new Date(data.getTime()));
				list.add(alumne);
			}

		}catch (SQLException e) {
			throw new DAOException("AlumneDAO.ErrorCercaAlumnes",e); 
		}
		finally{
			if(rs!=null)
				try {
					rs.close();
				} catch (SQLException e) {}
			if(stmt!=null)
				try {
					stmt.close();
				} catch (SQLException e) {}
		}
		return list;
	}

	/**
	 * Retorna tots els vehicles
	 * {post: es retornar� un vector amb tots els alumnes }
	 * @return Vector amb tots els alumnes
	 * @throws DAOException
	 */
	@Override
	public List<Alumne> findAll() throws DAOException {
		return this.find(""); 
	}

	/**
	 * Retorna un alumne pel seu identificador metode sobreescrit per rebre el id en
	 * numeric
	 * {pre: el id que rebem com a parametre pertany a un alumne de la BD}
	 * {post: es retornara el alumne que tingui com a indentificador el id que hem rebut}
	 * @param id - Identificador del alumne que busquem en format numeric
	 * @return Alumne que te com a identificador el que hem rebut
	 * @throws DAOException
	 */
	public Alumne findById(Long id) throws DAOException{
		return this.findById(Long.toString(id));
	}

	/**
	 * Retorna un alumne pel seu identificador
	 * {pre: el id que rebem com a parametre pertany a un alumne de la BD}
	 * {post: es retornara el alumne que tingui com a indentificador el id que hem rebut}
	 * @param id - Identificador del alumne que busquem
	 * @return Alumne que te com a identificador el que hem rebut
	 * @throws DAOException
	 */
	@Override
	public Alumne findById(String id) throws DAOException {
		
		if(id == null) throw new DAOException("AlumneDAO.ErrorIdentificadorNull"); 
		
		Statement stmt = null;
		ResultSet rs = null;
		Alumne alumne = null;
		
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_ALUMNO, NOMBRE, APELLIDOS, FECHA_NACIMIENTO"); 
		sql.append("  FROM ALUMNOS"); 
		sql.append(" WHERE ID_ALUMNO = ").append(id); 
		
		try {
			stmt = this.conn.createStatement();
			rs = stmt.executeQuery(sql.toString());
			while(rs.next()){
				alumne = new Alumne();
				alumne.setIdAlumne(rs.getLong(1));
				alumne.setNom(rs.getString(2));
				alumne.setCognoms(rs.getString(3));
				java.sql.Date data = rs.getDate(4);
				if(!rs.wasNull()) alumne.setDataNaixement(new Date(data.getTime()));
			}
			
		}catch (SQLException e) {
			throw new DAOException("AlumneDAO.ErrorCercaAlumnes",e); 
		}
		finally{
			if(rs!=null)
				try {
					rs.close();
				} catch (SQLException e) {}
			if(stmt!=null)
				try {
					stmt.close();
				} catch (SQLException e) {}
		}
		return alumne;
	}

	/** 
	 * No s'implementa ja que no es necessari per aquesta PAC 
	 */
	@Override
	public void insert(Alumne alumne) throws DAOException {}

	/** 
	 * No s'implementa ja que no es necessari per aquesta PAC 
	 */
	@Override
	public void update(Alumne alumne) throws DAOException {}

	//Metode per fer proves
	public static void main(String[] args) throws GestorException {
			    
	    try{

	    	AlumneDAO alumneDAO = new AlumneDAO();

	    	//Cerquem tots els alumnes
	    	System.out.println("--------------------------------------"); 
	    	List<Alumne> alumnes  = alumneDAO.findAll();
	    	java.util.Iterator<Alumne> it = alumnes.iterator();
	    	while(it.hasNext()) {

	    	    Alumne alu = it.next(); 
	    	    System.out.println(alu.getNom() + " " + alu.getCognoms());
	    	} 
	    	
	    }catch(DAOException e){
	    	System.out.println(e.getMessage() + e.getCause());
	    }
	}
}
